﻿using System.Collections.Generic;
using System.Linq;
using MIAP.DataAccess.Interfaces;
using MIAP.Entidades;

namespace MIAP.Negocio
{
    public class AltaArchivosNegocio
    {
        /// <summary>
        /// Instancia para el acceso a datos de Administración de archivos.
        /// </summary>
        private readonly IArchivosDao daoArchivos;

        /// <summary>
        /// Instancia para el acceso a datos de Formato Archivos
        /// </summary>
        private readonly IFormatoArchivoDao daoFormatoArchivos;

        /// <summary>
        /// Instancia para el acceso a datos de usuarios
        /// </summary>
        private readonly IUsuarioDao daoUsuarios;

        #region Constructor

        /// <summary>
        /// Inicializa una nueva instancia <see cref="AltaArchivosNegocio"/>
        /// </summary>
        public AltaArchivosNegocio()
        {
            this.daoArchivos = DataAccessFactory.Instance.CreateArchivosDao();
            this.daoFormatoArchivos = DataAccessFactory.Instance.CreateFormatoArchivosDao();
            this.daoUsuarios = DataAccessFactory.Instance.CreateUsuariosDao();
        }

        #endregion

        #region Metodos

        /// <summary>
        /// Obtiene las lista de usuarios activos registrados en el sistema
        /// </summary>
        /// <returns>lista de objetos usuarioInfo</returns>
        public IList<UsuarioInfo> GetUsuarios()
        {
            return this.daoUsuarios.GetUsuarios().ToList();
        }


        /// <summary>
        /// Obtiene las lista de usuarios activos registrados en el sistema cn la bandera en aquelos que pueden realizar carga
        /// </summary>
        /// <returns>lista de objetos usuarioInfo</returns>
        public IList<UsuarioInfo> GetTodosUsuariosConCarga(int idArchivo)
        {
            var listaUsuarios = this.daoUsuarios.GetUsuarios().ToList();
            var listaUsuariosCarga = this.daoUsuarios.GetUsuariosCargan(idArchivo);
            foreach (var usuarioInfo in listaUsuariosCarga)
            {
                listaUsuarios.Single(usuario => usuario.IdUsuario == usuarioInfo.IdUsuario).IsChecked = true;
            }
            return listaUsuarios;
        }

        /// <summary>
        /// Obtenemos los formatos de archivos existentes en la base de datos
        /// </summary>
        /// <returns></returns>
        public List<FormatoArchivoInfo> GetFormatosArchivo()
        {
            return this.daoFormatoArchivos.GetFormatosArchivo().ToList();

        }

        /// <summary>
        /// Agrega un nuevo Archivo.
        /// </summary>
        /// <param name="archivo">Es el proyecto que será agregado.</param>
        /// <param name="user">Usuario que esta agregando la información.</param>
        public void AddNewArchivo(ArchivoInfo archivo, string user, List<UsuarioInfo> usersLoads)
        {
            this.daoArchivos.AddNewArchivo(archivo, user, usersLoads);
        }

        /// <summary>
        /// Modifica la información de un Archivo .
        /// </summary>
        /// <param name="archivo">Es el Archivo al que se le modificará la información.</param>
        /// <param name="user">Es el usuario que esta modificando la información.</param>
        public void EditArchivo(ArchivoInfo archivo, string user, List<UsuarioInfo> usersLoads)
        {
            this.daoArchivos.EditArchivo(archivo, user, usersLoads);
        }

        /// <summary>
        /// Obtiene la información de un determinado Archivo.
        /// </summary>
        /// <param name="idArchivo">Es el id del Archivo del que se desea obtener la informacion.</param>
        /// <returns>Información general del Archivo.</returns>
        public ArchivoInfo GetArchivoById(int idArchivo)
        {
            return this.daoArchivos.GetArchivoById(idArchivo);
        }

        /// <summary>
        /// Verifica la existencia de un archivo en un determinado proyecto.
        /// </summary>
        /// <param name="idProyecto">Es el id del proyecto con el que esta ligado el archivo.</param>
        /// <param name="nombreArchivo">Es el nombre del archivo.</param>
        /// <returns>Indicador de si el archivo existe o no y esta ligado al id del proyecto.</returns>
        public bool VerifyExistNombreArchivoInProyecto(int idProyecto, string nombreArchivo)
        {
            return this.daoArchivos.VerifyExistNombreArchivoInProyecto(idProyecto, nombreArchivo);
        }
        #endregion
    }
}
